package com.lfd.validated.global;

import com.lfd.validated.pojo.ApiResponse;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.HashMap;
import java.util.Map;

/**
 * @项目名： spring-emq
 * @包名： com.lfd.validated.global
 * @文件名: GlobalExceptionHandler
 * @创建者: liufudong@szyh-smart.com
 * @创建时间: 2024/10/11 15:33
 * @描述：创建一个全局异常处理类
 * 使用 @ControllerAdvice 注解来处理控制器中的异常，并自定义返回的响应格式。这里，你可以捕获 MethodArgumentNotValidException，该异常是在 @Validated 验证失败时抛出的。
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST) // 400 错误
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResponse<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        for (FieldError error : ex.getBindingResult().getFieldErrors()) {
            errors.put(error.getField(), error.getDefaultMessage());
        }
        // 返回自定义的 ApiResponse 对象
        ApiResponse<Map<String, String>> apiResponse= new ApiResponse<Map<String, String>>();
        apiResponse.setCode(HttpStatus.BAD_REQUEST.value());
        apiResponse.setData(errors);
        return apiResponse;
    }
}
